#include<stdio.h>
#include<stdlib.h> // size_t、wchar_t、div_t、ldiv_t和lldiv_t； 宏例如EXIT_FAILURE、EXIT_SUCCESS、RAND_MAX和MB_CUR_MAX等等； 常用的函数如malloc()、calloc()
#include<unistd.h> // write函数和getpid
#include<signal.h>

// 信号处理函数
void sig_quit(int signo)
{    
    printf("收到了 SIGQUIT 信号 \n");

    if(signal(SIGQUIT, SIG_DFL) == SIG_ERR)
    {
        printf("将SIGQUIT 置为默认失败 \n");
        exit(1);
    }
}

int main(int argc, char *const *argv)
{
    // 定义新的信号集和原有的信号集
    sigset_t newmask, oldmask, pendmask;

    //  注册信号对应的信号处理函数
    if (signal(SIGQUIT, sig_quit) == SIG_ERR)
    {
        printf("无法捕捉SIGQUIT信号\n");
        exit(1);
    }

    sigemptyset(&newmask); // 将信号集中所有信号清零
    sigaddset(&newmask, SIGQUIT); // 忽略SIGOUT信号

    if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0) 
    {
        printf("sigprocmask 失败 \n");
        exit(1);
    }
    
    printf("开始睡10s, 此时无法接收SIGQUIT \n");
    sleep(10);
    printf("结束睡10s，------------------ \n");

    if(sigismember(&newmask, SIGQUIT))
    {
        printf("SIGQUIT 确实被屏蔽了 \n");
    }
    else
    {
        printf("SIGQUIT 没有被屏蔽 \n");
    }

    if (sigismember(&newmask, SIGHUP))
    {
        printf("SIGHUP 确实被屏蔽了 \n");
    }
    else
    {
        printf("SIGHUP 没有被屏蔽 \n");
    }
    

    // 现在取消对 SIGQUIT 的屏蔽， 将信号集还原回去
    if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)
    {
        printf("sigprocmask(SIG_SETMASK) 失败 \n");
        exit(1);
    }
    printf("sigprocmask(SIG_SETMASK) 成功 \n");


    if(sigismember(&oldmask, SIGQUIT))
    {
        printf("SIGQUIT 被屏蔽了 \n");
    }
    else
    {
        printf("SIGQUIT 没有被屏蔽，现在可以发送SIGQUIT 信号了 \n");
        printf("开始睡10s,---------\n");
        int mysl = sleep(10);
        if (mysl > 0)
        {
            printf("还没睡够，还差 %d 秒---------\n", mysl);
        }
    }

    printf("程序执行结束 \n");

    return 0;

    
}
